package com.yuntsg.nnsfcp.service.front.ut;

import org.apache.commons.codec.binary.Hex;
import org.apache.commons.codec.digest.DigestUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;


/**
 * 加密工具类
 *
 * @author ：ljx
 * @date ：Created in 2019/9/19
 */
public class MD5Utils {

    private static final Logger logger = LoggerFactory.getLogger(MD5Utils.class);

    private static MessageDigest messagedigest = null;

    static {
        try {
            messagedigest = MessageDigest.getInstance("MD5");
        } catch (NoSuchAlgorithmException e) {
            logger.error("MD5 messagedigest初始化失败", e);
        }
    }

    public static void main(String[] args) {
        String artice = "20191204";
        String time = "20191204";
        String key = "JLTSG_gzhtcm";

        //F05723558997A15C4349158CB1AD106C

        String md5ToUp = getMd5For32BitToUp(time + key + artice);
        String str = md5ForSubStr(md5ToUp, 7, 13);
        System.out.println(str);
        System.out.println(md5ToUp);

    }

    /**
     * 对一个文件获取md5值
     *
     * @return md5串
     */
    public static String getFileMD5(File file) {

        try (FileInputStream fileInputStream = new FileInputStream(file);) {
            return getStreamMD5(fileInputStream);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 得到 stream 的 md5 值
     *
     * @param input 输入流
     * @return
     */
    public static String getStreamMD5(InputStream input) {
        try {
            byte[] buffer = new byte[8192];
            int length;
            while ((length = input.read(buffer)) != -1) {
                messagedigest.update(buffer, 0, length);
            }
            return new String(Hex.encodeHex(messagedigest.digest()));
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 得到 md5 32位的
     *
     * @param str 明文
     * @return
     */
    public static String getMd5For32Bit(String str) {
        return DigestUtils.md5Hex(str);
    }

    /**
     * 得到 md5 32位的 小写
     *
     * @param str 明文
     * @return
     */
    public static String getMd5For32BitLower(String str) {
        return DigestUtils.md5Hex(str).toLowerCase();
    }

    /**
     * 得到 md5 32位大写的
     *
     * @param str 明文
     * @return
     */
    public static String getMd5For32BitToUp(String str) {
        return DigestUtils.md5Hex(str).toUpperCase();
    }

    /**
     * 得到 md5 16位
     *
     * @param str 明文
     * @return
     */
    public static String getMd5For16Bit(String str) {
        return DigestUtils.md5Hex(str).substring(8, 24);
    }

    /**
     * 得到 md5 16位 大写
     *
     * @param str 明文
     * @return
     */
    public static String getMd5For16BitToUp(String str) {
        return DigestUtils.md5Hex(str).substring(8, 24).toUpperCase();
    }

    /**
     * 返回切割的 md5
     *
     * @param md5   密文
     * @param index 切割开始
     * @param last  切割结束
     * @return
     */
    public static String md5ForSubStr(String md5, int index, int last) {
        return md5.substring(index, last);
    }

    public static String getMD5String(byte[] bytes) {
        return DigestUtils.md5Hex(bytes);
    }

    /**
     * 判断明文 是否等于 MD5
     *
     * @param password  明文
     * @param md5PwdStr 密文
     * @return
     */
    public static boolean checkPassword(String password, String md5PwdStr) {
        String s = DigestUtils.md5Hex(password);
        return s.equals(md5PwdStr);
    }

}
